// Loesung_von_Aufgabe_2.5.7_4_Holzklotz

// beschleunigte Bewegung eines Holzklotzes

// Die einfachen Variablen werden deklariert und initialisiert
float m = 4; // Masse
float g = 9.81; // Erdbeschleunigung
float FzB = 100; // Betrag der ziehenden Kraft
float FnB = g*m; // Betrag der Normalkraft
float mue = 0.4; // Gleitreibungskoeffizient
float FrB = mue*FnB; // Betrag der Gleitreibungskraft
float w = 60; // Winkelangabe in Grad zwischen Fz und Horizontalen
float t; // Zeit

// Die Vektoren werden deklariert und initialisiert
PVector r = new PVector(100, 150); // Ortsvektor des Holzklotzes beim Start
PVector v = new PVector(0, 0); // Geschwindigkeit des Holzklotzes beim Start
PVector Fz = new PVector(FzB*cos(radians(w)), FzB*sin(radians(w))); // ziehende Kraft
PVector Fh = new PVector(FzB*cos(radians(w)), 0); // horizontale Komponente der ziehenden Kraft
PVector Fn = new PVector(0, FnB); // Die Gewichtskraft des Holzklotzes ist gleich der Normalkraft Fn
PVector Fr = new PVector(-FrB, 0); // bewegungshemmende Reibungskraft Fr
PVector Fb = PVector.add(Fh, Fr); // beschleunigende Kraft Fb als vektorielle Summe von Fh und Fr
PVector a = PVector.div(Fb, m); // Beschleunigung des Holzklotzes

float FbB = Fb.mag(); // Betrag von Fb wird berechnet

void setup()
{
  size(600, 300);
}

void draw()
{
  background(255);
  t = 1/frameRate;

  // Auflistung der im Fenster dargestellten Kräfte
  textSize(24);
  fill(255, 0, 0);
  text("Fz", 10, 50);
  fill(0, 200, 0);
  text("Fh", 50, 50);
  fill(0, 0, 255);
  text("Fn", 90, 50);
  fill(255, 0, 255);
  text("Fr", 130, 50);

  if (FbB >= FrB) // Bedingung für die Bewegung des Holzklotzes
  {
    // Geschwindigkeit und Ortskoordinate des Holzklotzes
    v.add(PVector.mult(a, t)); // Bei jedem Durchlauf wird v1 um a1 mal t vergrößert
    r.add(PVector.mult(v, t)); // Bei jedem Durchlauf wird r1 um v1 mal t vergrößert
  }

  textSize(30);
  fill(0);
  text("v in m/s = " +round(v.x), 200, 50);
  text("t in s = " +millis()/1000, 200, 100);

  // Holzklotz
  noStroke();
  fill(230, 200, 100);
  rect(r.x-30, r.y-15, 60, 30); 

  // Untergrund mit seitlichen Mauern
  noStroke();
  fill(200);
  rect(0, 165, 600, 135);
  rect(0, 100, 70, 100);
  rect(530, 100, 70, 100);

  translate(r.x, r.y);

  // Die Vektoren werden gezeichnet
  // ziehende Kraft als roter Vektor
  stroke(255, 0, 0);
  strokeWeight(3);
  line(0, 0, Fz.x, -Fz.y);
  fill(255, 0, 0);
  ellipse(Fz.x, -Fz.y, 5, 5);

  // Fh als grüner Vektor
  stroke(0, 200, 0); 
  strokeWeight(3);
  line(0, 0, Fh.x, Fh.y);
  fill(0, 200, 0);
  ellipse(Fh.x, Fh.y, 5, 5);

  // Fn als blauer Vektor
  stroke(0, 0, 255); 
  strokeWeight(3);
  line(0, 0, Fn.x, Fn.y);
  fill(0, 0, 255);
  ellipse(Fn.x, Fn.y, 5, 5);

  // Fr als violetter Vektor
  stroke(255, 0, 255); 
  strokeWeight(3);
  line(0, 0, Fr.x, Fr.y);
  fill(255, 0, 255);
  ellipse(Fr.x, Fr.y, 5, 5);

  if (r.x >= 500)
  {
    noLoop();
  }
}